package com.home.security.core.encryption;

import org.apache.shiro.crypto.hash.SimpleHash;

import java.util.Random;

/**
 * Description: 加密工具类
 * Created by 王大宸 on 2021-01-18 15:13
 * Created with IntelliJ IDEA.
 */
public class HashUtils {

    /**
     * 加密算法
     */
    public final static String hashAlgorithmName = "SHA-256";

    /**
     * 循环次数
     */
    public final static int hashIterations = 16;

    /**
     * 私有构造器
     **/
    private HashUtils() {
    }


    /***
     * Description：shiro 盐加密
     *             加密方式: SHA-256
     *             循环次数: 16 次
     *
     * @author 王大宸
     * @date 2020-2-8 12:18
     * @param password   密码(这里使用的是 密码+账号 模式,保证密码的唯一性和不可随意篡改)
     * @param salt       密码盐
     * @return java.lang.String
     */
    public static String toHash256(String password, String salt) {
        return new SimpleHash(hashAlgorithmName, password, salt, hashIterations).toString();
    }

    /***
     * Description： 获取密码盐
     *
     * @author 王大宸
     * @date 2020-2-8 12:24
     * @param
     * @return java.lang.String
     */
    public static String getSalt() {
        return getRandomStr(20);
    }

    /***
     * 功能说明： 验证密码是否正确
     *
     * @author 王大宸
     * @date 2020/7/8 10:36
     * @param password   需要验证的密码
     * @param salt       密码盐
     * @param dbPassword 数据库密码
     * @return java.lang.Boolean
     */
    public static Boolean authPassword(String password, String salt, String dbPassword) {
        return dbPassword.equals(toHash256(password, salt));

    }

    /***
     * 功能说明：生成随机长度的字符串
     *
     * @author 王大宸
     * @date 2020/7/29 10:38
     * @param bytes 指定长度
     * @return java.lang.String
     */
    public static String getRandomStr(int bytes) {
        StringBuilder sb = new StringBuilder();
        Random random = new Random();
        for (int i = 0; i < bytes; i++) {
            //随机判断判断该字符是数字还是字母
            String choice = random.nextInt(2) % 2 == 0 ? "char" : "num";
            if ("char".equalsIgnoreCase(choice)) {
                //随机判断是大写字母还是小写字母
                int start = random.nextInt(2) % 2 == 0 ? 65 : 97;
                sb.append((char) (start + random.nextInt(26)));
            } else if ("num".equalsIgnoreCase(choice)) {
                sb.append(random.nextInt(10));
            }
        }
        return sb.toString();
    }

}
